package com.auth.config.response;

import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.security.oauth2.common.exceptions.OAuth2Exception;
import org.springframework.security.oauth2.provider.error.DefaultWebResponseExceptionTranslator;
import org.springframework.security.oauth2.provider.error.WebResponseExceptionTranslator;

/**
 * @author: hw
 * @date: 2020/12/24 11:31
 */
@Slf4j
public class CustomWebResponseExceptionTranslator implements WebResponseExceptionTranslator {


    /**
     * 默认实现方式
     */
    private WebResponseExceptionTranslator<OAuth2Exception> defaultTranslator = new DefaultWebResponseExceptionTranslator();


    /**
     * 自定义异常返回类型
     * @param e 异常类型
     * @return
     * @throws Exception
     */
    @Override
    public ResponseEntity<CustomOauthException> translate(final Exception e) throws Exception {
        // 使用默认翻译器翻译异常
        ResponseEntity<OAuth2Exception> defaultResponse = defaultTranslator.translate(e);
        // 构建自己的错误对象
        String errorCode = defaultResponse.getBody().getOAuth2ErrorCode();
        String message = defaultResponse.getBody().getMessage();
        if (errorCode.equals("invalid_grant")){
            errorCode = "-2";
            message = "token已过期,请重新登录";
        }
        log.info("系统内部错误信息："+errorCode);
        log.info("系统自定义错误信息："+message);
        CustomOauthException customOauthException = new CustomOauthException(message,errorCode);
        // 使用与默认OAuth2错误相同的状态码
        return new ResponseEntity<>(customOauthException, defaultResponse.getStatusCode());
    }
}
